{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 二、收集数据和预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>6/1/2020 9:09</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码           消费日期           产品说明  数量     单价    用户码  城市\n",
       "0  536374   21258  6/1/2020 9:09        五彩玫瑰五支装  32  10.95  15100  北京\n",
       "1  536376   22114  6/1/2020 9:32       茉莉花白色25枝  48   3.45  15291  上海\n",
       "2  536376   21733  6/1/2020 9:32  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海\n",
       "3  536378   22386  6/1/2020 9:37       百合粉色10花苞  10   1.95  14688  北京\n",
       "4  536378  85099C  6/1/2020 9:37       橙黄香槟色康乃馨  10   1.95  14688  北京"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd #导入Pandas\n",
    "df_sales = pd.read_csv('data.csv') #载入数据\n",
    "df_sales.head() #显示头几行数据 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 收集数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "日期范围（格式转化前）: 1/1/2021 10:11 ~ 9/9/2020 9:20\n",
      "日期范围（格式转化后）: 2020-06-01 09:09:00 ~ 2021-06-09 12:31:00\n"
     ]
    }
   ],
   "source": [
    "print('日期范围（格式转化前）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max())) #显示日期范围（格式转换前）\n",
    "df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转换日期格式\n",
    "print('日期范围（格式转化后）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))#显示日期范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "日期范围（删除不完整的月份）: 2020-06-01 09:09:00 ~ 2021-05-31 17:39:00\n"
     ]
    }
   ],
   "source": [
    "df_sales = df_sales.loc[df_sales['消费日期'] < '2021-06-01'] #只保留整月数据\n",
    "print('日期范围（删除不完整的月份）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max())) #显示日期范围"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "消费日期\n",
      "2020-06-30    398\n",
      "2020-07-31    252\n",
      "2020-08-31    271\n",
      "2020-09-30    337\n",
      "2020-10-31    272\n",
      "Freq: M, Name: 订单号, dtype: int64\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期'])\n",
    "df_orders_monthly = df_sales.set_index('消费日期')['订单号'].resample('M').nunique() # 计算每个月的订单数量\n",
    "print(df_orders_monthly.head())\n",
    "\n",
    "ax = pd.DataFrame(df_orders_monthly.values).plot(grid=True,figsize=(12,6),legend=False)\n",
    "ax.set_xlabel('month')\n",
    "ax.set_ylabel('order num')\n",
    "ax.set_title('order num every month')\n",
    "\n",
    "plt.xticks(range(len(df_orders_monthly.index)),\n",
    "            [x.strftime('%m.%Y') for x in df_orders_monthly.index],\n",
    "            rotation=45)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sales = df_sales.drop_duplicates() #删除重复的数据行\n",
    "# df_sales = df_sales.loc[df_sales['数量'] > 0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.4 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>总价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>2020-06-01 09:09:00</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>350.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>165.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>163.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码                消费日期           产品说明  数量     单价    用户码  城市  \\\n",
       "0  536374   21258 2020-06-01 09:09:00        五彩玫瑰五支装  32  10.95  15100  北京   \n",
       "1  536376   22114 2020-06-01 09:32:00       茉莉花白色25枝  48   3.45  15291  上海   \n",
       "2  536376   21733 2020-06-01 09:32:00  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海   \n",
       "3  536378   22386 2020-06-01 09:37:00       百合粉色10花苞  10   1.95  14688  北京   \n",
       "4  536378  85099C 2020-06-01 09:37:00       橙黄香槟色康乃馨  10   1.95  14688  北京   \n",
       "\n",
       "      总价  \n",
       "0  350.4  \n",
       "1  165.6  \n",
       "2  163.2  \n",
       "3   19.5  \n",
       "4   19.5  "
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales['总价'] = df_sales['数量'] * df_sales['单价'] #计算每单的总价\n",
    "df_sales.head() #显示头几行数据  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.5 构建特征集和标签集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "构建特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>总价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>2020-06-01 09:09:00</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>350.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>165.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>163.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码                消费日期           产品说明  数量     单价    用户码  城市  \\\n",
       "0  536374   21258 2020-06-01 09:09:00        五彩玫瑰五支装  32  10.95  15100  北京   \n",
       "1  536376   22114 2020-06-01 09:32:00       茉莉花白色25枝  48   3.45  15291  上海   \n",
       "2  536376   21733 2020-06-01 09:32:00  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海   \n",
       "3  536378   22386 2020-06-01 09:37:00       百合粉色10花苞  10   1.95  14688  北京   \n",
       "4  536378  85099C 2020-06-01 09:37:00       橙黄香槟色康乃馨  10   1.95  14688  北京   \n",
       "\n",
       "      总价  \n",
       "0  350.4  \n",
       "1  165.6  \n",
       "2  163.2  \n",
       "3   19.5  \n",
       "4   19.5  "
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales_3m = df_sales[(df_sales.消费日期 > '2020-06-01') & (df_sales.消费日期 <= '2020-08-30')] #构建仅含头三个月数据的数据集\n",
    "df_sales_3m.reset_index(drop=True) #重置索引\n",
    "df_sales_3m.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15100</td>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15291</td>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14688</td>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15311</td>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15862</td>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码  R值   F值        M值\n",
       "0  15100  45    6    635.10\n",
       "1  15291  35   35   1329.95\n",
       "2  14688   6   85   1472.28\n",
       "3  15311   5  715  12711.66\n",
       "4  15862  89   64    354.23"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.DataFrame(df_sales['用户码'].unique()) #生成以用户码为主键的结构\n",
    "df_user.columns = ['用户码'] #设定字段名\n",
    "df_user.head() #显示头几行数据\n",
    "df_R_value = df_sales_3m.groupby('用户码').消费日期.max().reset_index() #找到每个用户的最近消费日期，构建df_R_value对象\n",
    "df_R_value.columns = ['用户码','最近购买日期'] #设定字段名\n",
    "df_R_value['R值'] = (df_R_value['最近购买日期'].max() - df_R_value['最近购买日期']).dt.days #计算最新日期与上次消费日期的天数\n",
    "df_user = pd.merge(df_user, df_R_value[['用户码','R值']], on='用户码') #把上次消费距最新日期的天数（R值）合并至df_user结构\n",
    "df_F_value = df_sales_3m.groupby('用户码').消费日期.count().reset_index() #计算每个用户消费次数，构建df_F_value对象\n",
    "df_F_value.columns = ['用户码','F值'] #设定字段名\n",
    "df_user = pd.merge(df_user, df_F_value[['用户码','F值']], on='用户码') #把消费频率(F值)整合至df_user结构\n",
    "df_M_value = df_sales_3m.groupby('用户码').总价.sum().reset_index() #计算每个用户三个月消费总额，构建df_M_value对象\n",
    "df_M_value.columns = ['用户码','M值'] #设定字段名\n",
    "df_user = pd.merge(df_user, df_M_value, on='用户码') #把消费总额整合至df_user结构\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "构建标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>年度LTV</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14681</td>\n",
       "      <td>498.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>14682</td>\n",
       "      <td>52.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14684</td>\n",
       "      <td>1201.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14687</td>\n",
       "      <td>628.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>14688</td>\n",
       "      <td>4449.48</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码    年度LTV\n",
       "0  14681   498.95\n",
       "1  14682    52.00\n",
       "2  14684  1201.51\n",
       "3  14687   628.38\n",
       "4  14688  4449.48"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_1y = df_sales.groupby('用户码')['总价'].sum().reset_index() #计算每个用户整年消费总额，构建df_user_1y对象\n",
    "df_user_1y.columns = ['用户码','年度LTV'] #设定字段名\n",
    "df_user_1y.head() #显示头几行数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "      <th>年度LTV</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15100</td>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15291</td>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "      <td>4596.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14688</td>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "      <td>4449.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15311</td>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "      <td>58218.04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15862</td>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "      <td>659.73</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码  R值   F值        M值     年度LTV\n",
       "0  15100  45    6    635.10    635.10\n",
       "1  15291  35   35   1329.95   4596.51\n",
       "2  14688   6   85   1472.28   4449.48\n",
       "3  15311   5  715  12711.66  58218.04\n",
       "4  15862  89   64    354.23    659.73"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_LTV = pd.merge(df_user, df_user_1y, on='用户码', how='left') #构建整体LTV训练数据集\n",
    "df_LTV.head() #显示df_LTV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建特征集和标签集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   R值   F值        M值\n",
       "0  45    6    635.10\n",
       "1  35   35   1329.95\n",
       "2   6   85   1472.28\n",
       "3   5  715  12711.66\n",
       "4  89   64    354.23"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = df_LTV.drop(['用户码','年度LTV'],axis=1) #特征集\n",
    "X.head() #显示特征集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      635.10\n",
       "1     4596.51\n",
       "2     4449.48\n",
       "3    58218.04\n",
       "4      659.73\n",
       "Name: 年度LTV, dtype: float64"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = df_LTV['年度LTV'] #标签集\n",
    "y.head() #显示标签集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.6 拆分训练集、验证集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "# 先拆分训练集和其它集\n",
    "X_train, X_rem, y_train, y_rem = train_test_split(X,y, train_size=0.7,random_state = 36)\n",
    "# 再把其它集拆分成验证集和测试集 \n",
    "X_valid, X_test, y_valid, y_test = train_test_split(X_rem,y_rem, test_size=0.5,random_state = 36)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 三、选择算法创建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression #导入线性回归模型\n",
    "from sklearn.tree import DecisionTreeRegressor #导入决策树回归模型\n",
    "from sklearn.ensemble import RandomForestRegressor #导入随机森林回归模型\n",
    "model_lr = LinearRegression() #创建线性回归模型\n",
    "model_dtr = DecisionTreeRegressor() #创建决策树回归模型\n",
    "model_rfr = RandomForestRegressor() #创建随机森林回归模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 四、训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n",
       "           max_features='auto', max_leaf_nodes=None,\n",
       "           min_impurity_decrease=0.0, min_impurity_split=None,\n",
       "           min_samples_leaf=1, min_samples_split=2,\n",
       "           min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n",
       "           oob_score=False, random_state=None, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_lr.fit(X_train, y_train) #拟合线性回归模型\n",
    "model_dtr.fit(X_train, y_train) #拟合决策树模型\n",
    "model_rfr.fit(X_train, y_train) #拟合随机森林模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 五、模型的评估与优化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_valid_preds_lr = model_lr.predict(X_valid) #用线性回归模型预测验证集\n",
    "y_valid_preds_dtr = model_dtr.predict(X_valid) #用决策树模型预测验证集\n",
    "y_valid_preds_rfr = model_rfr.predict(X_valid) #用随机森林模型预测验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "R值       1.00\n",
       "F值     153.00\n",
       "M值    1413.83\n",
       "Name: 163, dtype: float64"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.iloc[2] #随便选择一个数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真值: 4391.9399999999905\n",
      "线性回归预测值: 7549.22894678151\n",
      "决策树预测值: 4596.510000000002\n",
      "随机森林预测值: 6048.145000000002\n"
     ]
    }
   ],
   "source": [
    "print('真值:', y_valid.iloc[2])  #线性回归模型预测值\n",
    "print('线性回归预测值:', y_valid_preds_lr[2])  #线性回归模型预测值\n",
    "print('决策树预测值:', y_valid_preds_dtr[2])  #决策树模型预测值\n",
    "print('随机森林预测值:', y_valid_preds_rfr[2]) #随机森林模型预测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "验证集上的R平方分数-线性回归: 0.4333\n",
      "验证集上的R平方分数-决策树: 0.3401\n",
      "验证集上的R平方分数-随机森林: 0.6190\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score,   median_absolute_error #导入Sklearn评估模块\n",
    "print('验证集上的R平方分数-线性回归: %0.4f' % r2_score(y_valid, model_lr.predict(X_valid)))\n",
    "print('验证集上的R平方分数-决策树: %0.4f' % r2_score(y_valid, model_dtr.predict(X_valid)))\n",
    "print('验证集上的R平方分数-随机森林: %0.4f' % r2_score(y_valid, model_rfr.predict(X_valid)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "绘制预测值和真值的散点图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_preds_rfr = model_lr.predict(X_test) #随机森林模型预测验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'实际值 vs. 预测值')"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(y_test, y_test_preds_rfr) #预测值和实际值的散点图\n",
    "plt.plot([0, max(y_test)], [0, max(y_test_preds_rfr)],   color='gray', lw=1, linestyle='--') #绘图\n",
    "plt.xlabel('实际值') #X轴\n",
    "plt.ylabel('预测值') #Y轴\n",
    "plt.title('实际值 vs. 预测值') #标题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "绘制模型性能比较图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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DiQ9PZ22bdvyj3/8A4DPPvuMDh06BC28V61axY8//sg555wTtPAu/CzfeustUlNTSUpK4rrrrmPXrl1AaA3n/vvv5/TTTy+1L5RIVVclL7JzKDjxxBMpKChg/fr1zJo1K2iP/fPPP3P66afTo0cPli9fzsyZM/nkk0+oXbs2P/zww15j/PDDD8yYMYPly5djZmzZsmWf5Vx11VU89thjdOnShczMTO69917GjRsH/LdV95w5c7j33ntL3CQF8NFHH5Gbm8sRRxzBnDlz+Oabb/jkk09wD7WkWLBgAfXr12fGjBksWLCA6tWrM3jwYKZNm8bll1++11hvvPFGcELc559/HvU1Z5xxBg8++CALFy6kTp06dO3alfT09GCMf/3rX8ydO5dq1arx+9//nl69ejF58mQ2b95Mx44dOfvss/m///s/hg4dyiWXXMLPP/+MuzNr1iwSExN57bXXgFDn2R07dnDttdcyf/58WrRowYABA3jyySeD60jUqVOHDz/8cD9/yiJVj0IhhkJrbMW3x3777be55pprqF27NkDQyrpQ/fr1qVmzJoMGDaJ3795Ba+lCW7duZcuWLUFTuauvvpr+/fsHz0dr1V2SHj16cMQRRwQ1v/baa7Rt2xYItcVYuXIlW7ZsISsri7S00NnyP/30E8cff3wwxhlnnMG6deto0qQJDz74IABvv/121NfUqFGDbt26Bcu8+OKL+eabb4Kx+vfvT7Vq1faqp3DMwhbe//M//8Po0aNZs2YNF154ISeddBLJycmMGDGCESNG0KdPH04//XRycnJo2bIlLVq0AEJhOmnSpCAULrnkklI/H5HDgUIhRlatWkVcXByNGzfGPXp77Ndffz1oFx1N9erV+fTTT5k7dy7Tpk3j8ccf55133ilzDdFadZekaMvsP/7xj/z2t7/da56xY8dy7bXXcv/990cd4/3336dGjRpcddVV3HvvvTz00EO4e9TX/O1vf9uvembOnBl8qRc6+eST6dy5M6+++ipnn302U6ZM4cwzzyQ7O5s5c+YwbNgwzjvvPHr06FHmZYkczrRPIQY2bNjADTfcwJAhQzCzYttj9+jRg2eeeYYdO3YA7LP5aNu2bWzdupVzzz2XcePGkZubu9fzDRo04Igjjgj2Fzz33HPl1oq6Z8+eTJo0ie3btwOQl5fHxo0bOeuss3jppZfYuHEjAJs2bdrrr3uA2rVrM27cOJ555hm2bNlS7Gs6duzIvHnz2LJlC7t37+bvf/97ifU8+uijwXRkC++TTjqJ2267jd69e7NkyRLWrl1L3bp1ufLKK7nzzjtZuHAhrVq14ssvv2TVqlBrreeff15tu0WiqJJrCsc0a8a6Ev4CP5DxSvPTTz+RmprK7t27qV69evCFBMW3x+7Vqxe5ubmkpaVRo0YNzj33XP785z8HY/7444/07duXnTt34u6MHTt2n+VOmTKFG264gR07dnDiiSfy7LPPlst7Pvfcc1m+fHlwhbd69erx4osvkpSUxD333MNZZ50VtOOeOHHiPi3NExIS6N+/PxMmTOCuu+6K+poOHTowbNgw0tPTadq0Ka1bty62hfc999zD7bffTlJSEgUFBZx00knMmjWLF198kalTpxIfH89xxx3H6NGjWbBgASNGjKBatWrUqFGDiRMnUrt2bSZNmsSFF15Ifn4+HTt25LrrriuXz0qkKolZ6+xYUevsqqWwhffu3bvp27cvN954I3369Knsssqsqv7uqXX2oemX3jpbpFR33303bdu2JTk5mVNOOWWfnekiUrGq5OYj+eWItklMRCqP1hRERCSgUBARkYBCQUREAgoFEREJVMlQSEw8tlxbZycmHlvqMgtbZ7dp04Y+ffpE7VN0IFavXk2bNm3KZayBAwfSvHnzoH125Mlg5W3+/PksWLAgmB41ahRNmzYlNTWVVq1aMXXq1JgtW0QOXJUMhTVr1uFOud3WrFlX6jJr1apFbm4un3/+OUceeSTjx4+vgHe6/x5++GFyc3PJzc3l1ltvLfPr8vPz92s5RUMB4I477iA3N5dZs2Zx/fXXB2d4H4z9retglKVViMgvXZUMhcoW2TZ627ZtdO/enXbt2pGUlMSsWbOA0BrAaaedxnXXXUfr1q3p0aMHP/30EwA5OTmkpKTQuXPnvcJl586dXHPNNSQlJdG2bVvmzZsHwOTJk+nXrx99+vShefPmPP7444wZM4a2bdvSqVOnfdpnFDV16lSSkpJo06YNw4cPDx6vW7cumZmZdOzYkY8++oicnBy6dOlC+/bt6dmzJ99//z0Ajz76aNDe+9JLL2X16tVMnDiRsWPHkpqauk/b7pYtW1K7du2gzfe//vUvevXqRfv27TnjjDNYvnx58HinTp3o0KEDmZmZ1K1bFwgFTkZGBpdffjlJSUlAqG1FYWvu66+/nvz8fPLz8xk4cCBt2rQhKSkpOPy1aL0QajHSr18/kpOT6dSpE0uWLAFCaziDBw+mR48e5XYxIpFDWqVfNWI/b2W9yE5FX9ii8CI7e/bs8Ysvvthfe+01dw9dtGXr1q3u7r5hwwZv0aKFFxQU+Ndff+1xcXG+aNEid3fv37+/P/fcc+7unpSU5PPnz3d396FDh3rr1q3d3f2RRx7xgQMHurv7F1984ccff7z/9NNP/uyzz3qLFi38P//5j69fv97r16/vEyZMcHf322+/3ceOHevu7ldffbUnJiZ6SkqKp6Sk+JIlS3zt2rV+/PHH+/r163337t2ekZHhM2bMCD7H6dOnu7v7rl27vHPnzr5+/Xp3d582bZpfc8017u7epEkT37lzp7t7cJGde+65xx9++OHg84mczsnJ8V//+tfBc926dfOVK1e6u/vHH3/sGRkZ7u7eu3dvf/HFF93dfcKECcFnPG/ePK9du7avWrXK3UM///POO8937drl7u433nijT5kyxbOzs/2ss84KllNYW7R6hwwZ4qNGjXJ397lz53pKSkpQd7t27XzHjh1Rf+66yI5uFXkry3dRcSjjRXZ08lo5Kex9tHr1atq3b8/ZZ58NhP5njRw5kvfee49q1aqxdu1a1q0LbY4q3L4P/21vXbQd9pVXXhlcF+CDDz7glltuAeDUU0+lWbNmrFy5EoCMjAzq1atHvXr1aNCgQdAqIikpKfirF0Kbjy6++OJgetasWXTt2pVGjRoBMGDAAN577z369etHXFwcF110EQArVqzg888/D95Xfn4+TZo0ASA5OZkBAwbQr1+/4BoK0YwdO5annnqKVatW8frrrwOhNakFCxbs1fL7559/BkLXd5g5cyYAl19+eXCRIYD09HSaN28OwNy5c8nJyaFDhw7Bz6Jx48b06dOHVatWccstt9C7d++gU2q0ej/44ANeeeUVALp168amTZvYunUrAOeffz61atUq9n2JVCXafFROCvcprFmzhl27dgWbfV544QU2bNhATk4Oubm5HHPMMezcuRP4b2tr+G97a3cvtp12KOyjixyrWrVqwXS1atVK3BZe0pg1a9YkLi4umK9169bB/ojPPvuMN998E4BXX32Vm2++mZycHNq3b1/s8u644w5WrFjB9OnTueqqq9i5cycF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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np #导入NumPy\n",
    "  \n",
    "# fig = plt.figure()\n",
    "fig, ax = plt.subplots()    \n",
    "\n",
    "width = 0.25\n",
    "\n",
    "# bar 的高度\n",
    "bars1 = [r2_score(y_valid, model_lr.predict(X_valid))]\n",
    "bars2 = [r2_score(y_valid, model_dtr.predict(X_valid))]\n",
    "bars3 = [r2_score(y_valid, model_rfr.predict(X_valid))]\n",
    " \n",
    "# The x position of bars\n",
    "r1 = np.arange(len(bars1))\n",
    "r2 = [x + width for x in r1]\n",
    "r3 = [x + width*2 for x in r1]\n",
    " \n",
    "# Create blue bars\n",
    "plt.bar(r1, bars1, width = width, color = 'blue', edgecolor = 'black', capsize=7, label='LinearRegression')\n",
    " \n",
    "# Create cyan bars\n",
    "plt.bar(r2, bars2, width = width, color = 'cyan', edgecolor = 'black', capsize=7, label='DecisionTreeRegressor')\n",
    "\n",
    "# Create cyan bars\n",
    "plt.bar(r3, bars3, width = width, color = 'yellow', edgecolor = 'black', capsize=7, label='RandomForestRegressor')\n",
    "\n",
    "# general layout\n",
    "plt.xticks([r + width for r in range(len(bars1))], ['validate collection'])\n",
    "plt.ylabel('R2 score')\n",
    "plt.xlabel('model')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.0 ('base')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "vscode": {
   "interpreter": {
    "hash": "ad2bdc8ecc057115af97d19610ffacc2b4e99fae6737bb82f5d7fb13d2f2c186"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
